# Process this file with autoconf to produce a configure script.
AC_INIT
AC_CONFIG_SRCDIR([src/liboggz/oggz.c])

AC_PREREQ(2.53)

AC_CANONICAL_TARGET

AM_INIT_AUTOMAKE(liboggz, 1.1.1)
AM_CONFIG_HEADER(opus_config.h)

################################################################################
# Set the shared versioning info, according to section 6.3 of the libtool info #
# pages. CURRENT:REVISION:AGE must be updated immediately before each release: #
#                                                                              #
#   * If the library source code has changed at all since the last             #
#     update, then increment REVISION (`C:R:A' becomes `C:r+1:A').             #
#                                                                              #
#   * If any interfaces have been added, removed, or changed since the         #
#     last update, increment CURRENT, and set REVISION to 0.                   #
#                                                                              #
#   * If any interfaces have been added since the last public release,         #
#     then increment AGE.                                                      #
#                                                                              #
#   * If any interfaces have been removed since the last public release,       #
#     then set AGE to 0.                                                       #
#                                                                              #
################################################################################
SHARED_VERSION_INFO="8:0:6"
SHLIB_VERSION_ARG=""

# Checks for programs.
AC_PROG_CC
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_PROG_LIBTOOL

AC_C_CONST
AC_C_BIGENDIAN

dnl Add parameters for aclocal
AC_SUBST(ACLOCAL_AMFLAGS, "-I m4")

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([fcntl.h inttypes.h stdlib.h string.h sys/types.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_OFF_T
AC_TYPE_SIZE_T

dnl Check whether the compiler allows signed enums.
dnl Re: http://lists.xiph.org/pipermail/ogg-dev/2008-July/001108.html
dnl
dnl "The ISO C standard, in section 6.7.2.2 "enumeration specifiers",
dnl paragraph 4, says
dnl
dnl   Each enumerated type shall be compatible with *char*, a signed
dnl   integer type, or an unsigned integer type.  The choice of type is
dnl   implementation-defined, but shall be capable of representing the
dnl   values of all the members of the declaration."
dnl
dnl -- http://gcc.gnu.org/ml/gcc-bugs/2000-09/msg00271.html
AC_MSG_CHECKING([if $CC allows signed enums])

ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Wall -Wextra -Werror"
AC_TRY_COMPILE([], [
               void t (void)
               {
                 enum {A, B} a=A;
                 if (a < 0) {}
               } ],
               [ AC_DEFINE([ALLOW_SIGNED_ENUMS], [],
                           [Define if the compiler implements enums as signed values.])
                 AC_MSG_RESULT(yes) ],
               [ AC_MSG_RESULT(no) ])
CFLAGS="$ac_save_CFLAGS"

# Checks for library functions.
AC_CHECK_FUNCS([memmove])

# Check for pkg-config
AC_CHECK_PROG(HAVE_PKG_CONFIG, pkg-config, yes)

# Check for doxygen
AC_CHECK_PROG(HAVE_DOXYGEN, doxygen, true, false)
AM_CONDITIONAL(HAVE_DOXYGEN,$HAVE_DOXYGEN)
if test $HAVE_DOXYGEN = "false"; then
             AC_MSG_WARN([*** doxygen not found, docs will not be built])
fi

# Check for man2html
AC_CHECK_PROG(HAVE_MAN2HTML, man2html, true, false)
AM_CONDITIONAL(HAVE_MAN2HTML, $HAVE_MAN2HTML)

# Check for valgrind
VALGRIND_ENVIRONMENT=""
ac_enable_valgrind=no
AC_ARG_ENABLE(valgrind-testing,
     AC_HELP_STRING([--enable-valgrind-testing], [enable running of tests inside Valgrind]),
     [ ac_enable_valgrind=yes ], [ ac_enable_valgrind=no] )

if test "x${ac_enable_valgrind}" = xyes ; then
  if test "x${enable_shared}" = xyes ; then
    VALGRIND_ENVIRONMENT="libtool --mode=execute "
  fi

  AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
  if test "x$HAVE_VALGRIND" = xyes ; then
    VALGRIND_ENVIRONMENT="$VALGRIND_ENVIRONMENT valgrind -q --leak-check=yes --show-reachable=yes --num-callers=50"
    AC_SUBST(VALGRIND_ENVIRONMENT)
    TESTS_INFO="Test suite will be run under:
    ${VALGRIND_ENVIRONMENT}"
  else
    TESTS_INFO="(Valgrind not found)"
  fi
else
  TESTS_INFO="(Valgrind testing not enabled)"
fi

dnl Checks for libraries.
LIBS=""

# check for getopt in a separate library
HAVE_GETOPT=no
AC_CHECK_LIB(getopt, getopt, HAVE_GETOPT="yes")
if test "x$HAVE_GETOPT" = xyes ; then
  GETOPT_LIBS="-lgetopt"
  AC_SUBST(GETOPT_LIBS)
fi

# check for getopt_long in standard library
HAVE_GETOPT_LONG=no
AC_CHECK_FUNC(getopt_long, HAVE_GETOPT_LONG="yes")
if test "x$HAVE_GETOPT_LONG" = xyes ; then
  AC_DEFINE(HAVE_GETOPT_LONG, [], [Define to 1 if you have the 'getopt_long' function])
fi

dnl Overall configuration success flag
oggz_config_ok=yes

oggz_read_programs=""
oggz_rw_programs=""

dnl
dnl  Configuration option for building of experimental code.
dnl

ac_enable_experimental=no
AC_ARG_ENABLE(experimental,
     AC_HELP_STRING([--enable-experimental], [enable building of experimental code]),
     [ ac_enable_experimental=yes ])

if test "x${ac_enable_experimental}" = xyes ; then
    AC_DEFINE(OGGZ_CONFIG_EXPERIMENTAL, [], [Define to build experimental code])
fi

dnl
dnl  Configuration option for building of reading support.
dnl

ac_enable_read=yes
AC_ARG_ENABLE(read,
     AC_HELP_STRING([--disable-read], [disable building of reading support]),
     [ ac_enable_read=no ], [ ac_enable_read=yes] )

if test "x${ac_enable_read}" = xyes ; then
    AC_DEFINE(OGGZ_CONFIG_READ, [1], [Build reading support])
    oggz_read_programs="oggz-dump oggz-info oggz-scan oggz-codecs"
else
    AC_DEFINE(OGGZ_CONFIG_READ, [0], [Do not build reading support]) 
fi
AM_CONDITIONAL(OGGZ_CONFIG_READ, test "x${ac_enable_read}" = xyes)

dnl
dnl  Configuration option for building of writing support.
dnl
  
ac_enable_write=yes
AC_ARG_ENABLE(write,
     AC_HELP_STRING([--disable-write], [disable building of writing support]),
     [ ac_enable_write=no ], [ ac_enable_write=yes] )

if test "x${ac_enable_write}" = xyes ; then
    AC_DEFINE(OGGZ_CONFIG_WRITE, [1], [Build writing support])
    if test "x${ac_enable_read}" = xyes ; then
      oggz_rw_programs="oggz-rip oggz-merge oggz-chop oggz-comment oggz-sort oggz-validate"
    fi
else
    AC_DEFINE(OGGZ_CONFIG_WRITE, [0], [Do not build writing support])
fi
AM_CONDITIONAL(OGGZ_CONFIG_WRITE, test "x${ac_enable_write}" = xyes)

dnl
dnl  Check read/write option sanity
dnl
if test "x${ac_enable_read}" = xno && test "x${ac_enable_write}" = xno ; then
  AC_MSG_ERROR([
***
*** You have attempted to explicitly disable both writing and reading.
***
])
fi

dnl
dnl Detect Ogg
dnl

HAVE_OGG=no
if test "x$HAVE_PKG_CONFIG" = "xyes" ; then
  PKG_CHECK_MODULES(OGG, ogg >= 1.0, HAVE_OGG=yes, HAVE_OGG=no)
fi

if test "x$HAVE_OGG" = "xno" ; then
  XIPH_PATH_OGG(HAVE_OGG="yes", HAVE_OGG="no")
  if test "x$HAVE_OGG" = xno ; then
    oggz_config_ok="no"
    AC_CHECK_LIB(ogg, ogg_stream_init, HAVE_OGG="maybe")
  fi
fi

AM_CONDITIONAL(HAVE_OGG, [test "x$HAVE_OGG" = "xyes"])

dnl Check for const-correct version of <ogg/ogg.h>
dnl In libogg changeset:14463, function prototypes like:
dnl      ogg_page_bos (ogg_page * og);
dnl were changed to:
dnl     ogg_page_bos (const ogg_page * og);
dnl If we are compiling with -Werror, we need to know this.
if test "x$HAVE_OGG" = "xyes" ; then
    AC_MSG_CHECKING([if ogg_page_bos() takes a const argument])
    ac_save_CFLAGS="$CFLAGS"
    ac_save_LIBS="$LIBS"
    CFLAGS="$CFLAGS -Wall -Werror $OGG_CFLAGS"
    LIBS="$LIBS $OGG_LIBS"

    AC_TRY_COMPILE([#include <ogg/ogg.h>],
                   [int f(const ogg_page * cog){return ogg_page_bos(cog);}],
                   [ AC_DEFINE([OGG_H_CONST_CORRECT], [], [Define if <ogg/ogg.h> is const-correct])
                     AC_MSG_RESULT(yes) ],
                   [ AC_MSG_RESULT(no) ])

    CFLAGS="$ac_save_CFLAGS"
    LIBS="$ac_save_LIBS"
fi

dnl Large file support
dnl Adapted from: libsndfile by Erik de Castro Lopo
dnl
dnl Find an appropriate type for oggz_off_t
dnl On systems supporting files larger than 2 Gig, oggz_off_t must be a
dnl 64 bit value. Unfortunately there is more than one way of ensuring
dnl this so need to do some pretty rigourous testing here.

unset ac_cv_sizeof_off_t

AC_CHECK_SIZEOF(off_t, 1)

case "$host_os" in
    mingw*)
        TYPEOF_OGGZ_OFF_T="__int64"
        OGGZ_OFF_MAX="0x7FFFFFFFFFFFFFFFLL"
        SIZEOF_OGGZ_OFF_T=8
        ;;
    *)
        if test "x$ac_cv_sizeof_off_t" = "x8" ; then
            # If sizeof (off_t) is 8, no further checking is needed.
            TYPEOF_OGGZ_OFF_T="off_t"
            OGGZ_OFF_MAX="0x7FFFFFFFFFFFFFFFLL"
            SIZEOF_OGGZ_OFF_T=8
        else
            # Check for common 64 bit file offset types.
            AC_CHECK_SIZEOF(loff_t,1)       # Fake default value.
            AC_CHECK_SIZEOF(off64_t,1)      # Fake default value.

            TYPEOF_OGGZ_OFF_T="unknown"
            if test "x$ac_cv_sizeof_loff_t" = "x8" ; then
                TYPEOF_OGGZ_OFF_T="loff_t"
                SIZEOF_OGGZ_OFF_T=8
            elif test "x$ac_cv_sizeof_off64_t" = "x8" ; then
                TYPEOF_OGGZ_OFF_T="off64_t"
                SIZEOF_OGGZ_OFF_T=8
            fi

            # Save the old sizeof (off_t) value  and then unset it to see if it
            # changes when Large File Support is enabled.

            pre_largefile_sizeof_off_t=$ac_cv_sizeof_off_t
            unset ac_cv_sizeof_off_t

            AC_SYS_EXTRA_LARGEFILE

            if test "x$ac_cv_sys_largefile_CFLAGS" = "xno" ; then
                ac_cv_sys_largefile_CFLAGS=""
            fi
            if test "x$ac_cv_sys_largefile_LDFLAGS" = "xno" ; then
                ac_cv_sys_largefile_LDFLAGS=""
            fi
            if test "x$ac_cv_sys_largefile_LIBS" = "xno" ; then
                ac_cv_sys_largefile_LIBS=""
            fi

            AC_CHECK_SIZEOF(off_t,1)        # Fake default value.

            if test "x$ac_cv_sizeof_off_t" = "x8" ; then
                    OGGZ_OFF_MAX="0x7FFFFFFFFFFFFFFFLL"
            elif test "x$ac_cv_sizeof_off_t" = "x$pre_largefile_sizeof_off_t" ; then
                AC_MSG_WARN([[This machine does not seem to support 64 bit file offsets.]])
                TYPEOF_OGGZ_OFF_T="off_t"
                SIZEOF_OGGZ_OFF_T=$ac_cv_sizeof_off_t
            elif test "x$TYPEOF_OGGZ_OFF_T" = "xunknown" ; then
                echo
                echo "*** The configure process has determined that this system is capable"
                echo "*** of Large File Support but has not been able to find a type which"
                echo "*** is an unambiguous 64 bit file offset."
                echo "*** Please contact the author to help resolve this problem."
                echo
                AC_MSG_ERROR([[Bad file offset type.]])
            fi
        fi
    ;;
    esac

if test $SIZEOF_OGGZ_OFF_T = 4 ; then
    OGGZ_OFF_MAX="0x7FFFFFFF"
    PRI_OGGZ_OFF_T="l"
elif test $SIZEOF_OGGZ_OFF_T = 8 ; then
    PRI_OGGZ_OFF_T="ll"
fi

dnl The following configured variables are written into the public header
dnl <oggz/oggz_off_t_generated.h>:
dnl   oggz_off_t (typedef)
dnl   PRI_OGGZ_OFF_T (printf format)

AC_SUBST(TYPEOF_OGGZ_OFF_T)
AC_SUBST(PRI_OGGZ_OFF_T)

dnl SIZEOF_OGGZ_OFF_T and OGGZ_OFF_MAX are only used internally by liboggz
AC_DEFINE_UNQUOTED([SIZEOF_OGGZ_OFF_T],${SIZEOF_OGGZ_OFF_T}, [Set to sizeof (long) if unknown.])
AC_SUBST(SIZEOF_OGGZ_OFF_T)

AC_DEFINE_UNQUOTED([OGGZ_OFF_MAX],${OGGZ_OFF_MAX}, [Set to maximum allowed value of sf_count_t type.])
AC_SUBST(OGGZ_OFF_MAX)

AC_CHECK_TYPES(ssize_t)
AC_CHECK_SIZEOF(ssize_t,4)

# MacOS 10.4 only declares timezone for _XOPEN_SOURCE. Check for this.
AC_MSG_CHECKING([for timezone])
AC_COMPILE_IFELSE(
  AC_LANG_PROGRAM([#include <time.h>], [
    int seconds = 1234567;
    seconds -= timezone;
  ]), AC_MSG_RESULT([ok]),
  AC_MSG_RESULT([no])
  AC_MSG_CHECKING([for timezone with _XOPEN_SOURCE])
  AC_COMPILE_IFELSE(
    AC_LANG_PROGRAM([
#define _XOPEN_SOURCE
#include <time.h>
    ], [
      int seconds = 1234567;
      seconds -= timezone;
    ]),
   dnl _XOPEN_SOURCE is required
    AC_MSG_RESULT([ok])
    AC_DEFINE([_XOPEN_SOURCE], [1], 
      [Some systems need _XOPEN_SOURCE for timezone]),
   dnl it didn't work even with _XOPEN_SOURCE; httpdate will break 
    AC_MSG_RESULT([no])
  )
)

# Checks for typedefs, structures, and compiler characteristics.

dnl Add some useful warnings if we have gcc.
dnl changequote(,)dnl
if test "x$ac_cv_prog_gcc" = xyes ; then
  CFLAGS="$CFLAGS -Wall -Wextra -g -std=gnu99 -Wdeclaration-after-statement -Wno-unused"
fi
dnl changequote([,])dnl

dnl
dnl  Configuration option to add -Werror to all Makefiles
dnl

AC_ARG_ENABLE(gcc-werror,
     AC_HELP_STRING([--enable-gcc-werror], [enable -Werror in all Makefiles]),
     [ ac_enable_gcc_werror=yes ], [ ac_enable_gcc_werror=no] )

if test "x${ac_enable_gcc_werror}" = xyes ; then
  CFLAGS="-Werror $CFLAGS"
fi

dnl
dnl Shared library symbol versioning and hiding
dnl

case "$target_os" in
  linux* | solaris*|k*bsd*-gnu*|gnu*)
    SHLIB_VERSION_ARG="-Wl,--version-script=Version_script"
    ;;
  *)
    ;;
esac

# Checks for library functions.

dnl
dnl  Configuration tests complete -- provide summary of results.
dnl

if test $oggz_config_ok = no ; then

AC_MSG_RESULT([
**************************************************************

*** $PACKAGE $VERSION: Automatic configuration FAILED.

*** The file config.log has full details.

*** The following required libraries are missing or
*** misconfigured on your system:
])

if test "x$HAVE_OGG" != xyes ; then
    AC_MSG_RESULT(
[*** libogg, available from  http://www.xiph.org/ogg/])
fi
if test "x$HAVE_OGG" = xmaybe ; then
    AC_MSG_RESULT(
[      Development files missing: The libogg library binary seems to be
      installed, but building of a test program failed.
])
fi

AC_MSG_RESULT(
[*** If you install the required libraries from source, you
*** need to inform the dynamic linker of their location. If
*** you install them in a system-wide directory such as
*** /usr/local (the default), you must ensure that
*** /usr/local/lib is listed in /etc/ld.so.conf, then run
*** ldconfig to update the dynamic linking system.
*** Alternatively, you can set your LD_LIBRARY_PATH environment
*** variable to include the library installation directory.
])


AC_MSG_RESULT(
[**************************************************************
])


AC_MSG_ERROR([
***
*** After fixing the above problems, you must run ./configure again.
***
]) 

else

AS_AC_EXPAND(LIBDIR, ${libdir})
AS_AC_EXPAND(INCLUDEDIR, ${includedir})
AS_AC_EXPAND(BINDIR, ${bindir})
AS_AC_EXPAND(DOCDIR, ${datadir}/doc)

AC_SUBST(BINDIR)

AC_SUBST(SHLIB_VERSION_ARG)
AC_SUBST(SHARED_VERSION_INFO)

AC_OUTPUT([
Makefile
doc/Makefile
doc/Doxyfile
include/Makefile
include/oggz/Makefile
include/oggz/oggz_off_t_generated.h
src/Makefile
src/liboggz/Version_script
src/liboggz/Makefile
src/tools/Makefile
src/tools/oggz-diff
src/tools/oggz-chop/Makefile
src/tests/Makefile
src/examples/Makefile
apache/oggz-chop.conf
oggz.pc
oggz-uninstalled.pc
])

AC_MSG_RESULT([
------------------------------------------------------------------------
  $PACKAGE $VERSION:  Automatic configuration OK.

  General configuration:

    Experimental code: ........... ${ac_enable_experimental}
    Reading support: ............. ${ac_enable_read}
    Writing support: ............. ${ac_enable_write}

  Tools:

    ${oggz_read_programs}
    ${oggz_rw_programs}

  Installation paths:

    liboggz: ..................... ${LIBDIR}
    Tools: ....................... ${BINDIR}
    C header files: .............. ${INCLUDEDIR}/oggz
    Documentation: ............... ${DOCDIR}/$PACKAGE

  Building:

    Type 'make' to compile $PACKAGE.

    Type 'make install' to install $PACKAGE.

    Type 'make check' to test $PACKAGE using the unit and functional tests
    contained in the src/tests directory.
    ${TESTS_INFO}

  Example programs will be built but not installed.
------------------------------------------------------------------------
])


fi
